home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / system-config-printer / pysmb.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  12KB  |  485 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. USE_OLD_CODE = False
  5.  
  6. try:
  7.     import smbc
  8. except ImportError:
  9.     USE_OLD_CODE = True
  10.  
  11. import errno
  12. import gobject
  13. import gtk
  14. import os
  15. import pwd
  16. from debug import *
  17.  
  18. class AuthContext:
  19.     
  20.     def __init__(self, parent = None, workgroup = '', user = '', passwd = ''):
  21.         self.passes = 0
  22.         self.has_failed = False
  23.         self.auth_called = False
  24.         self.tried_guest = False
  25.         self.cancel = False
  26.         self.use_user = user
  27.         self.use_password = passwd
  28.         self.use_workgroup = workgroup
  29.         self.parent = parent
  30.  
  31.     
  32.     def perform_authentication(self):
  33.         self.passes += 1
  34.         if self.passes == 1:
  35.             return 1
  36.         
  37.         if not self.has_failed:
  38.             return 0
  39.         
  40.         debugprint('pysmb: authentication pass: %d' % self.passes)
  41.         if not self.auth_called:
  42.             debugprint('pysmb: auth callback not called?!')
  43.             self.cancel = True
  44.             return 0
  45.         
  46.         self.has_failed = False
  47.         if self.auth_called and not (self.tried_guest):
  48.             self.use_user = 'guest'
  49.             self.use_password = ''
  50.             self.tried_guest = True
  51.             debugprint('pysmb: try auth as guest')
  52.             return 1
  53.         
  54.         self.auth_called = False
  55.         d = gtk.Dialog('Authentication', self.parent, gtk.DIALOG_MODAL | gtk.DIALOG_NO_SEPARATOR, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
  56.         d.set_default_response(gtk.RESPONSE_OK)
  57.         d.set_border_width(6)
  58.         d.set_resizable(False)
  59.         hbox = gtk.HBox(False, 12)
  60.         hbox.set_border_width(6)
  61.         image = gtk.Image()
  62.         image.set_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, gtk.ICON_SIZE_DIALOG)
  63.         hbox.pack_start(image, False, False, 0)
  64.         vbox = gtk.VBox(False, 12)
  65.         label = gtk.Label('<span weight="bold" size="larger">' + 'You must log in to access %s.' % self.for_server + '</span>')
  66.         label.set_use_markup(True)
  67.         label.set_alignment(0, 0)
  68.         label.set_line_wrap(True)
  69.         vbox.pack_start(label, False, False, 0)
  70.         table = gtk.Table(3, 2)
  71.         table.set_row_spacings(6)
  72.         table.set_col_spacings(6)
  73.         table.attach(gtk.Label('Username:'), 0, 1, 0, 1, 0, 0)
  74.         username_entry = gtk.Entry()
  75.         table.attach(username_entry, 1, 2, 0, 1, 0, 0)
  76.         table.attach(gtk.Label('Domain:'), 0, 1, 1, 2, 0, 0)
  77.         domain_entry = gtk.Entry()
  78.         table.attach(domain_entry, 1, 2, 1, 2, 0, 0)
  79.         table.attach(gtk.Label('Password:'), 0, 1, 2, 3, 0, 0)
  80.         password_entry = gtk.Entry()
  81.         password_entry.set_activates_default(True)
  82.         password_entry.set_visibility(False)
  83.         table.attach(password_entry, 1, 2, 2, 3, 0, 0)
  84.         vbox.pack_start(table, False, False, 0)
  85.         hbox.pack_start(vbox, False, False, 0)
  86.         d.vbox.pack_start(hbox)
  87.         d.show_all()
  88.         if self.use_user == 'guest':
  89.             self.use_user = pwd.getpwuid(os.getuid())[0]
  90.             debugprint('pysmb: try as %s' % self.use_user)
  91.         
  92.         username_entry.set_text(self.use_user)
  93.         domain_entry.set_text(self.use_workgroup)
  94.         response = d.run()
  95.         d.hide()
  96.         if response == gtk.RESPONSE_CANCEL:
  97.             self.cancel = True
  98.             return -1
  99.         
  100.         self.use_user = username_entry.get_text()
  101.         self.use_password = password_entry.get_text()
  102.         self.use_workgroup = domain_entry.get_text()
  103.         return 1
  104.  
  105.     
  106.     def initial_authentication(self):
  107.         
  108.         try:
  109.             context = smbc.Context()
  110.             self.use_workgroup = context.workgroup
  111.         except:
  112.             pass
  113.  
  114.  
  115.     
  116.     def failed(self, exc = None):
  117.         self.has_failed = True
  118.         debugprint('pysmb: operation failed: %s' % repr(exc))
  119.         if exc:
  120.             if (self.cancel or type(exc) == RuntimeError) and exc.args[0] not in [
  121.                 errno.EACCES,
  122.                 errno.EPERM]:
  123.                 raise exc
  124.             
  125.         
  126.  
  127.     
  128.     def callback(self, server, share, workgroup, user, password):
  129.         debugprint('pysmb: got password callback')
  130.         self.auth_called = True
  131.         self.for_server = server
  132.         self.for_share = share
  133.         if self.passes == 1:
  134.             self.initial_authentication()
  135.         
  136.         if self.use_user:
  137.             if self.use_workgroup:
  138.                 workgroup = self.use_workgroup
  139.             
  140.             return (workgroup, self.use_user, self.use_password)
  141.         
  142.         user = ''
  143.         password = ''
  144.         return (workgroup, user, password)
  145.  
  146.  
  147. import os
  148. import sys
  149. import re
  150. nmblookup = '/usr/bin/nmblookup'
  151. smbclient = '/usr/bin/smbclient'
  152. wins = None
  153.  
  154. def get_wins_server():
  155.     global wins
  156.     smbconf = '/etc/samba/smb.conf'
  157.     wsregex = re.compile('\\s*wins\\s*server.*', re.IGNORECASE)
  158.     if wins:
  159.         return None
  160.     
  161.     
  162.     try:
  163.         file = open(smbconf, 'r')
  164.     except IOError:
  165.         return None
  166.  
  167.     for l in file.readlines():
  168.         t = l.splitlines()
  169.         if wsregex.match(t[0]):
  170.             sp = t[0].split('=')
  171.             winslist = sp[1]
  172.             winslist = winslist.lstrip()
  173.             winslist = winslist.rstrip()
  174.             file.close()
  175.             winstab = winslist.split(',')
  176.             wins = winstab[0]
  177.             continue
  178.     
  179.     file.close()
  180.  
  181.  
  182. def get_domain_list():
  183.     domains = { }
  184.     if not os.access(smbclient, os.X_OK):
  185.         return domains
  186.     
  187.     get_wins_server()
  188.     ips = []
  189.     if wins:
  190.         os.environ['WINS'] = wins
  191.         str = 'LC_ALL=C %s -U "$WINS" -M -- - 2>&1' % nmblookup
  192.     else:
  193.         str = 'LC_ALL=C %s -M -- - 2>&1' % nmblookup
  194.     for l in os.popen(str, 'r').readlines():
  195.         l = l.splitlines()[0]
  196.         if l.endswith('<01>'):
  197.             ips.append(l.split(' ')[0])
  198.             continue
  199.     
  200.     if len(ips) <= 0:
  201.         if wins:
  202.             os.environ['WINS'] = wins
  203.             str = 'LC_ALL=C %s -U "$WINS" "*" 2>&1' % nmblookup
  204.         else:
  205.             str = "LC_ALL=C %s '*' 2>&1" % nmblookup
  206.         for l in os.popen(str, 'r').readlines():
  207.             l = l.splitlines()[0]
  208.             ips.append(l.split(' ')[0])
  209.         
  210.     
  211.     for ip in ips:
  212.         dom = None
  213.         dict = {
  214.             'IP': ip }
  215.         os.environ['IP'] = ip
  216.         if wins:
  217.             os.environ['WINS'] = wins
  218.             str = 'LC_ALL=C %s -U "$WINS" -A "$IP"' % nmblookup
  219.         else:
  220.             str = 'LC_ALL=C %s -A "$IP"' % nmblookup
  221.         str += ' 2>&1'
  222.         for line in os.popen(str, 'r').readlines():
  223.             line = line.splitlines()[0]
  224.             if line.find(' <00> ') != -1 and line.find('<GROUP>') != -1:
  225.                 dom = line.split(' ')[0]
  226.                 dom = dom.lstrip()
  227.                 dict['IP'] = ip
  228.                 dict['DOMAIN'] = dom
  229.                 continue
  230.         
  231.         if dom:
  232.             domains[dom] = dict
  233.             continue
  234.     
  235.     return domains
  236.  
  237.  
  238. def get_host_list(dmbip):
  239.     serverlist = 0
  240.     hosts = { }
  241.     list = []
  242.     shareregex = re.compile('\\s*Sharename\\s*Type\\s*Comment')
  243.     serverregex = re.compile('\\s*Server\\s*Comment')
  244.     domainregex = re.compile('\\s*Workgroup\\s*Master')
  245.     commentregex = re.compile('(\\s*-+)+')
  246.     os.environ['DMBIP'] = dmbip
  247.     str = 'LC_ALL=C %s -N -L "//$DMBIP" 2>/dev/null' % smbclient
  248.     for l in os.popen(str, 'r').readlines():
  249.         l = l.splitlines()[0]
  250.         if serverregex.match(l):
  251.             serverlist = 1
  252.             continue
  253.         if shareregex.match(l):
  254.             serverlist = 0
  255.             continue
  256.         if domainregex.match(l):
  257.             serverlist = 0
  258.             continue
  259.         if commentregex.match(l):
  260.             continue
  261.             continue
  262.         if serverlist == 1:
  263.             l = l.split(' ')[0].lstrip()
  264.             if not l:
  265.                 continue
  266.             
  267.             list.append(l)
  268.             continue
  269.     
  270.     for name in list:
  271.         dict = {
  272.             'NAME': name }
  273.         hosts[name] = dict
  274.     
  275.     return hosts
  276.  
  277.  
  278. def get_host_list_from_domain(domain):
  279.     hosts = { }
  280.     ips = []
  281.     if wins:
  282.         str = "LC_ALL=C %s -U %s -R '%s' 2>&1" % (nmblookup, wins, domain)
  283.     else:
  284.         str = "LC_ALL=C %s -R '%s' 2>&1" % (nmblookup, domain)
  285.     for l in os.popen(str, 'r').readlines():
  286.         l = l.splitlines()[0]
  287.         if l.endswith('<00>'):
  288.             ips.append(l.split(' ')[0])
  289.             continue
  290.     
  291.     for ip in ips:
  292.         name = None
  293.         dict = {
  294.             'IP': ip }
  295.         os.environ['IP'] = ip
  296.         if wins:
  297.             os.environ['WINS'] = wins
  298.             str = 'LC_ALL=C %s -U "$WINS" -A "$IP"' % nmblookup
  299.         else:
  300.             str = 'LC_ALL=C %s -A "$IP"' % nmblookup
  301.         str += ' 2>&1'
  302.         for line in os.popen(str, 'r').readlines():
  303.             line = line.splitlines()[0]
  304.             if line.find(' <00> ') != -1 and line.find('<GROUP>') == -1:
  305.                 name = line.split(' ')[0]
  306.                 name = name.lstrip()
  307.                 dict['NAME'] = name
  308.                 dict['DOMAIN'] = domain
  309.                 continue
  310.         
  311.         if name:
  312.             hosts[name] = dict
  313.             continue
  314.     
  315.     return hosts
  316.  
  317.  
  318. def get_host_info(smbname):
  319.     '''Given an SMB name, returns a host dict for it.'''
  320.     dict = {
  321.         'NAME': smbname,
  322.         'IP': '',
  323.         'GROUP': '' }
  324.     os.environ['SMBNAME'] = smbname
  325.     if wins:
  326.         os.environ['WINS'] = wins
  327.         str = 'LC_ALL=C %s -U "$WINS" -S "$SMBNAME" 2>&1' % nmblookup
  328.     else:
  329.         str = 'LC_ALL=C %s -S "$SMBNAME" 2>&1' % nmblookup
  330.     for l in os.popen(str, 'r').readlines():
  331.         l = l.strip()
  332.         if l.endswith('<00>'):
  333.             dict['IP'] = l.split(' ')[0]
  334.             continue
  335.         
  336.         if l.find(' <00> ') == -1:
  337.             continue
  338.         
  339.         if l.find(' <GROUP> ') != -1:
  340.             dict['GROUP'] = l.split(' ')[0]
  341.             continue
  342.         name = l.split(' ')[0]
  343.         dict['NAME'] = name
  344.     
  345.     return dict
  346.  
  347.  
  348. def get_printer_list(host):
  349.     '''Given a host dict, returns a dict of printer shares for that host.
  350.     The value for a printer share name is its comment.'''
  351.     printers = { }
  352.     if not os.access(smbclient, os.X_OK):
  353.         return printers
  354.     
  355.     os.environ['NAME'] = host['NAME']
  356.     str = 'LC_ALL=C %s -N -L "$NAME" 2>&1' % smbclient
  357.     if host.has_key('IP'):
  358.         os.environ['IP'] = host['IP']
  359.         str += ' -I "$IP"'
  360.     
  361.     if host.has_key('GROUP'):
  362.         os.environ['GROUP'] = host['GROUP']
  363.         str += ' -W "$GROUP"'
  364.     
  365.     section = 0
  366.     typepos = 0
  367.     commentpos = 0
  368.     for l in os.popen(str, 'r'):
  369.         l = l.strip()
  370.         if l == '':
  371.             continue
  372.         
  373.         if l[0] == '-':
  374.             section += 1
  375.             if section > 1:
  376.                 break
  377.                 continue
  378.             continue
  379.         
  380.         if section == 0:
  381.             if l.find('Sharename ') != -1:
  382.                 typepos = l.find(' Type ') + 1
  383.                 commentpos = l.find(' Comment') + 1
  384.                 continue
  385.             continue
  386.         
  387.         if section != 1:
  388.             continue
  389.         
  390.         share = l[:l[typepos:].find(' ' + 'Printer'.ljust(commentpos - typepos, ' ')) + typepos].strip()
  391.         if share == -1 and share.endswith(' Printer'):
  392.             share = l[:-len(' Printer')].strip()
  393.         
  394.         if share == -1:
  395.             continue
  396.         
  397.         rest = l[len(share):].strip()
  398.         end = rest.find(' ')
  399.         if end == -1:
  400.             type = rest
  401.             comment = ''
  402.         else:
  403.             type = rest[:rest.find(' ')]
  404.             comment = rest[len(type):].strip()
  405.         if type == 'Printer':
  406.             printers[share] = comment
  407.             continue
  408.     
  409.     return printers
  410.  
  411.  
  412. def printer_share_accessible(share, group = None, user = None, passwd = None):
  413.     """Returns None if the share is inaccessible.  Otherwise,
  414.     returns a dict with 'GROUP' associated with the workgroup name
  415.     of the server."""
  416.     if not os.access(smbclient, os.X_OK):
  417.         return None
  418.     
  419.     args = [
  420.         smbclient,
  421.         share]
  422.     if os.getenv('KRB5CCNAME'):
  423.         args.append('-k')
  424.     elif passwd:
  425.         args.append(passwd)
  426.     else:
  427.         args.append('-N')
  428.     if group:
  429.         args.extend([
  430.             '-W',
  431.             group])
  432.     
  433.     args.extend([
  434.         '-c',
  435.         'quit'])
  436.     if user:
  437.         args.extend([
  438.             '-U',
  439.             user])
  440.     
  441.     (read, write) = os.pipe()
  442.     pid = os.fork()
  443.     if pid == 0:
  444.         os.close(read)
  445.         if write != 1:
  446.             os.dup2(write, 1)
  447.         
  448.         os.dup2(1, 2)
  449.         os.environ['LC_ALL'] = 'C'
  450.         os.execv(args[0], args)
  451.         sys.exit(1)
  452.     
  453.     dict = {
  454.         'GROUP': '' }
  455.     os.close(write)
  456.     for l in os.fdopen(read, 'r').readlines():
  457.         if l.startswith('Domain=[') and l.find(']') != -1:
  458.             dict['GROUP'] = l[len('Domain=['):].split(']')[0]
  459.             break
  460.             continue
  461.     
  462.     (pid, status) = os.waitpid(pid, 0)
  463.     if status:
  464.         return None
  465.     
  466.     return dict
  467.  
  468. if __name__ == '__main__':
  469.     domains = get_domain_list()
  470.     for domain in domains:
  471.         print domains[domain]
  472.         hosts = get_host_list_from_domain(domain)
  473.         if len(hosts) <= 0:
  474.             print 'fallback to get_host_list(IP)'
  475.             hosts = get_host_list(domains[domain]['IP'])
  476.         
  477.         print hosts
  478.         for host in hosts:
  479.             print hosts[host]
  480.             printers = get_printer_list(hosts[host])
  481.             print printers
  482.         
  483.     
  484.  
  485.